'''
欧氏距离：a = [1,3,4,6]
         b = [6,7,8,9]
         o1 = math.sqrt((6-1) ** 2 + (7-3) ** 2 + (8 - 4) ** 2 + (9 - 6) ** 2) 

a = [1,3]
b = [4,7]
o2 = math.sqrt((4-1) ** 2 + (7-3) ** 2)


欧氏距离公式的特殊情况就是勾股定理

欧氏距离应用:
         
'''
'''
余弦相似度:cosθ
'''

# # 欧式距离
# import math  
# import numpy as np
  
# def euclidean_distance(point1, point2):  
#     # 确保两个点具有相同的维度  
#     if len(point1) != len(point2):  
#         raise ValueError("两点必须具有相同的维度")  
  
#     distance = 0  
#     for i in range(len(point1)):  
#         distance += (point1[i] - point2[i]) ** 2  
  
#     return math.sqrt(distance)  
  
# # 示例用法  
# point_a = np.array([1,2])
# point_b = np.array([3,4])
# distance = euclidean_distance(point_a, point_b)  
# print(f"点 {point_a} 和点 {point_b} 之间的欧氏距离是: {distance}")



# # 余弦相似度代码
# import numpy as np  
  
# def cosine_similarity(vec1, vec2):  
#     # 确保两个向量具有相同的维度  
#     if len(vec1) != len(vec2):  
#         raise ValueError("两个向量必须具有相同的维度")  
  
#     # 使用NumPy的dot函数计算点积，并计算每个向量的范数  
#     dot_product = np.dot(vec1, vec2)  
#     # norm_a = np.linalg.norm(vec1)  
#     # norm_b = np.linalg.norm(vec2)  
#     norm_a = np.sqrt(vec1@vec1)
#     norm_b = np.sqrt(vec2@vec2)   
  
#     # 计算余弦相似度  
#     cosine_sim = dot_product / (norm_a * norm_b)  
  
#     # 确保余弦相似度在-1到1之间（由于浮点数的误差，可能超出这个范围）  
#     cosine_sim = max(-1, min(cosine_sim, 1))  
  
#     return cosine_sim  
  
# # 示例用法  
# vec_a = np.array([1,2])
# vec_b = np.array([3,4])
# similarity = cosine_similarity(vec_a, vec_b)  
# print(f"向量 {vec_a} 和向量 {vec_b} 之间的余弦相似度是: {similarity}")




# # 欧式距离!!!!

# import numpy as np
# a = np.array([1,2])
# b = np.array([3,4])
# ou = np.sqrt(((b - a) ** 2).sum())

# # 余弦相似度
# cos = np.dot(a,b)
# a = np.sqrt(a@a)
# b = np.sqrt(b@b)
# cos = cos/(a*b)
# print(ou,cos)




'''
在KNN里，如果像预测一朵新的鸢尾花的类别。
首先算出这朵花和所有历史样本花朵的距离。
从以上距离中找出离待预测花最近的样本。
'''

#欧式距离 例2 批量计算向量和多个向量的距离
import numpy as np
a1 = np.array([1,2])
A2 = np.array([[2,6],
               [3,4],
               [1,3]])

# for i in range(len(A2)):
#     # print(A2[i])
#     ou = np.sqrt(((A2[i] - a1) ** 2).sum())
#     print(ou)
dis = np.sqrt(((A2-a1) ** 2).sum(axis=1))

print(np.argmin(dis))           #agrmin找出最小值对应的下标
print(A2[np.argmin(dis)])